void main(List<String> args) {
  Man man = Man('小刚', 18);
  // 继承的属性和方法
  print(man.name);
  man.eat();
  // 通过mixin扩展的方法
  man.sing(man.name as String);

  Woman woman = Woman('小霞', 18);
  print(woman.age);
  woman.eat();

  woman.sing(woman.name as String);
  woman.danceType = '水上芭蕾';
  woman.dance(woman.name as String);
}

// 人类
class Person {
  Person(this.name, this.age);

  String? name;
  int? age;

  void eat() {
    print('$name --- eat');
  }
}

// 男人类
class Man extends Person with Sing {
  // 定义子类构造函数
  Man(super.name, super.age);
}

// 女人类
class Woman extends Person with Sing, Dance {
  Woman(super.name, super.age);
}

// mixin 表示一个没有构造函数的类，这个类的属性和方法可以组合到其他类中实现代码复用
// 唱歌方法的扩展类
mixin Sing {
  // 唱歌的方法
  sing(String name) {
    print('$name --- 爱唱歌');
  }
}

// 跳舞方法的扩展类
mixin Dance {
  // 舞种
  String? danceType;
  // 跳舞的方法
  void dance(String name) {
    print('$name --- 爱跳$danceType');
  }
}
